package top.lixunda.ecommerce.server.user.service;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;
import top.lixunda.ecommerce.server.business.api.entity.dto.PageDTO;
import top.lixunda.ecommerce.server.user.api.entity.db.RoleDO;
import top.lixunda.ecommerce.server.user.api.entity.dto.RoleChangeDTO;
import top.lixunda.ecommerce.server.user.api.entity.dto.RoleInsertAdminDTO;
import top.lixunda.ecommerce.server.user.api.entity.dto.RoleInsertStoreDTO;
import top.lixunda.ecommerce.server.user.api.entity.dto.RoleQueryDTO;

import java.util.List;

/**
 * 角色表，可以代表一种权限，分为官方后台角色和店铺角色，店铺角色每家店铺独享 服务类
 *
 * @author Xumda
 * @since 2020-04-23
 */
public interface IRoleService extends IService<RoleDO> {

    /**
     * 根据角色编号查询店铺可用角色信息
     *
     * @param id 角色编号
     * @return 角色数据
     */
    RoleDO queryStoreRoleById(Integer id);

    /**
     * 根据角色编号查询官方后台系统可用角色信息
     *
     * @param id 角色编号
     * @return 角色数据
     */
    RoleDO queryAdminRoleById(Integer id);

    /**
     * 根据角色编号查询店铺可用角色信息
     *
     * @param ids 角色编号列表
     * @return 角色数据列表
     */
    List<RoleDO> queryStoreRolesByIds(List<Integer> ids);

    /**
     * 根据角色编号查询官方后台系统可用角色信息
     *
     * @param ids 角色编号列表
     * @return 角色数据列表
     */
    List<RoleDO> queryAdminRolesByIds(List<Integer> ids);

    /**
     * 查询当前登陆店铺可用所有角色信息
     *
     * @return 角色信息列表
     */
    List<RoleDO> queryCurrentStoreAll();

    /**
     * 查询后台管理员可用所有角色信息
     *
     * @return 角色信息列表
     */
    List<RoleDO> queryCurrentAdminAll();

    /**
     * 条件分页查询当前登陆店铺可用所有角色信息
     *
     * @param pageDTO 条件分页数据
     * @return 角色信息分页数据
     */
    IPage<RoleDO> queryStoreRolePageWrapper(PageDTO<RoleDO, RoleQueryDTO> pageDTO);

    /**
     * 条件分页查询后台管理员可用所有角色信息
     *
     * @param pageDTO 条件分页数据
     * @return 角色信息分页数据
     */
    IPage<RoleDO> queryAdminRolePageWrapper(PageDTO<RoleDO, RoleQueryDTO> pageDTO);

    /**
     * 添加一条店铺角色信息数据
     *
     * @param list 添加数据DTO列表
     * @return 添加成功数据
     */
    List<RoleDO> insertStoreRole(List<RoleInsertStoreDTO> list);

    /**
     * 添加一条管理系统角色信息数据
     *
     * @param list 添加数据DTO列表
     * @return 添加成功数据
     */
    List<RoleDO> insertAdminRole(List<RoleInsertAdminDTO> list);

    /**
     * 修改一条店铺角色信息数据
     *
     * @param list 修改数据DTO列表
     * @return 修改成功数据
     */
    List<RoleDO> changeStoreRole(List<RoleChangeDTO> list);

    /**
     * 修改一条管理系统角色信息数据
     *
     * @param list 修改数据DTO列表
     * @return 修改成功数据
     */
    List<RoleDO> changeAdminRole(List<RoleChangeDTO> list);

    /**
     * 根据角色编号移除店铺角色信息
     *
     * @param roleIds 角色编号列表
     * @return 是否移除成功
     */
    Boolean removeStoreRole(List<Integer> roleIds);

    /**
     * 根据角色编号移除管理系统角色信息
     *
     * @param roleIds 角色编号列表
     * @return 是否移除成功
     */
    Boolean removeAdminRole(List<Integer> roleIds);

    /**
     * 修改一条店铺角色信息数据，固化数据修改
     *
     * @param list 修改数据DTO列表
     * @return 修改成功数据
     */
    List<RoleDO> changeStoreSolidifyRole(List<RoleChangeDTO> list);

    /**
     * 修改一条管理系统角色信息数据，固化数据修改
     *
     * @param list 修改数据DTO列表
     * @return 修改成功数据
     */
    List<RoleDO> changeAdminSolidifyRole(List<RoleChangeDTO> list);

    /**
     * 根据角色编号移除店铺角色信息，固化数据移除
     *
     * @param roleIds 角色编号列表
     * @return 是否移除成功
     */
    Boolean removeStoreSolidifyRole(List<Integer> roleIds);

    /**
     * 根据角色编号移除管理系统角色信息，固化数据移除
     *
     * @param roleIds 角色编号列表
     * @return 是否移除成功
     */
    Boolean removeAdminSolidifyRole(List<Integer> roleIds);

}
